package com.wu.yygh.hosp.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wu.yygh.common.utils.MD5;
import io.swagger.annotations.Api;
import org.springframework.util.StringUtils;
import com.wu.yygh.hosp.service.HospitalSetService;
import com.wu.yygh.model.hosp.HospitalSet;
import com.wu.yygh.vo.hosp.HospitalQueryVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.wu.yygh.common.result.Result;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;
import java.util.Random;

/**
 * @ClassName HospitalSetController
 * @Author 浮生光
 * @Date 2022/6/27 0:00
 * @Description HospitalSetController
 * @Version 1.0
 */
@Api(tags = "医院设置管理")
@RestController
@RequestMapping("/admin/hosp/hospitalSet")
//@CrossOrigin
public class HospitalSetController {
    @Autowired
    private HospitalSetService hospitalSetService;



////    访问路径：http://localhost:8201/admin/hosp/hospitalSet/findAll
//    //1 查询医院设置表所有信息
//    @ApiOperation(value = "获取所有医院设置")
//    @GetMapping("findAll")
//    public List<HospitalSet> findAllHospitalSet() {
//        //调用service的方法
//        List<HospitalSet> list = hospitalSetService.list();
//        return list;
//    }


    /**
     * 访问路径：http://localhost:8201/admin/hosp/hospitalSet/findAll
     *  1.查询医院设置表中所有信息 这里还对逻辑删除过的数据过滤了 ✔
     */
    @ApiOperation(value = "获取分页列表")
    @GetMapping("/findAll")
    public Result getAllHospitalSet() {
        // 直接利用封装好的方法执行操作
        // return hospitalSetService.list();
        // 使用同一返回结果
        return Result.ok(hospitalSetService.list());
    }

//    //2 逻辑删除医院设置
//    @ApiOperation(value = "逻辑删除医院设置")
//    @DeleteMapping("{id}")
//    public boolean removeHospSet(@PathVariable Long id) {
//        boolean flag = hospitalSetService.removeById(id);
//         return flag;
//    }


    /**
     * http://localhost:8201/admin/hosp/hospitalSet?id
     * 2.删除医院设置 通常用逻辑删除实现 ✔
     * 我们在实体类中继承了BaseEntity com.baomidou.mybatisplus.annotation.TableLogic
     */
    @DeleteMapping("{id}")
    @ApiOperation(value = "删除医院配置信息")
    public Result removeHospitalSet(@PathVariable Long id) {
        boolean flag = hospitalSetService.removeById(id);
        if (flag) {
            return Result.ok();
        }
        return Result.fail();
    }


    /**
     * 3.条件查询带分页 ✔
     * 参数：医院名称、医院编号、页码、每页数量
     * - 创建vo类，封装条件值 com.yjiewei.yygh.vo.hospital.HospitalSetQueryVo
     * - 编写controller，获取条件对象，分页数据（当前页、每页数量）
     */
    @ApiOperation("根据条件分页查询")
    @PostMapping("/findPageHospSet/{current}/{limit}")
    public Result findPageOfHospitalSet(@PathVariable long current,
                                        @PathVariable long limit,
                                        // 注意这里使用的 @RequestBody 注解，表示页面传入参数时以json的格式传入，必须使用post的方式
                                        @RequestBody(required = false) HospitalQueryVo hospitalQueryVo){
        // 1.创建page对象，传入页码和条数
        Page<HospitalSet> page = new Page<>(current, limit);

        // 2.调用方法实现分页查询
        QueryWrapper<HospitalSet> queryWrapper = new QueryWrapper<>();
        if (!StringUtils.isEmpty(hospitalQueryVo.getHosname())){
            queryWrapper.like("hosname", hospitalQueryVo.getHosname());
        }
        if (!StringUtils.isEmpty(hospitalQueryVo.getHoscode())){
            queryWrapper.eq("hoscode", hospitalQueryVo.getHoscode());
        }
        // 2.1真正查询
        Page<HospitalSet> hospitalSetPage = hospitalSetService.page(page, queryWrapper);
        return Result.ok(hospitalSetPage);
    }


    /**
     * 4.添加医院设置 ✔
     * - 如果没有必要参数的情况下不予添加 前端可以做限制吧 后端判断的话感觉不大友好了，都提交请求了
     */
    @ApiOperation("添加医院配置")
    @PostMapping("/addHospitalSet")
    public Result addHospitalSet(@RequestBody HospitalSet hospitalSet){

        hospitalSet.setStatus(1);
        hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis() + "" + new Random().nextInt(1000)));

        // 前端对参数必填项做限制，这里简单判断
        if (hospitalSet != null) {
            boolean save = hospitalSetService.save(hospitalSet);
            if (save) {
                return Result.ok();
            }
        }else {
//            log.info("请重新确认要添加的医院配置，当前添加的配置为null");
        }
        return Result.fail();
    }


    /**
     * 6.根据id获取医院设置 ✔
     */
    @ApiOperation("根据ID获取医院配置")
    @GetMapping("/findById/{id}")
    public Result getHospitalSetById(@PathVariable Integer id) {
        HospitalSet hospitalSet = hospitalSetService.getById(id);
        return Result.ok(hospitalSet);
    }

    /**
     * 5.修改医院设置 ✔
     * - 直接传入一个配置，根据配置中的ID去对应修改
     */
    @ApiOperation("修改医院设置")
    @PostMapping("/updateHospitalSet")
    public Result updateHospitalSet(@RequestBody HospitalSet hospitalSet) {
        boolean update = hospitalSetService.updateById(hospitalSet);
        if (update) return Result.ok();
        return Result.fail();
    }

    /**
     * 7.批量删除医院设置 ✔
     * - 根据传入的ID数组去批量删除
     */
    @ApiOperation("批量删除医院设置")
    @DeleteMapping("/batchDelete")
    public Result batchDeleteHospitalSet(@RequestBody List<Long> idList ){
        boolean remove = hospitalSetService.removeByIds(idList);
        if (remove) {return Result.ok();}
        return Result.fail();
    }

    /**
     * 8.医院设置锁定和解锁 就是医院设置可用或不可用的更改操作
     */
    @ApiOperation("医院设置锁定和解锁")
    @PutMapping("/lockHospitalSet/{id}/{status}")
    public Result lockHospitalSet(@PathVariable Long id,
                                  @PathVariable Integer status) {
        // 根据ID查询对应的医院设置并改变状态
        HospitalSet hospitalSet = hospitalSetService.getById(id);
        hospitalSet.setStatus(status);

        hospitalSetService.updateById(hospitalSet);
        return Result.ok();
    }


    /**
     * 9.发送签名密钥
     * 是获取到数据库中医院设置中的密钥然后通过短信的方式发送出去
     */
    @ApiOperation("发送签名密钥")
    @PutMapping("/sendKey/{id}")
    public Result sendKey(@PathVariable Long id) {
        HospitalSet hospitalSet = hospitalSetService.getById(id);
        String signKey = hospitalSet.getSignKey();
        String hoscode = hospitalSet.getHoscode();
        // TODO:发送短信服务
        return Result.ok();
    }


}
